home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene Storm
/
Scene Storm - Volume 1.iso
/
coding
/
asm
/
misc
/
execports
/
waitport.s
< prev
Wrap
Text File
|
1992-09-02
|
4KB
|
162 lines
;==============================================================[ Description ]=
; This is an example of a source, which waits for message from other
; task. You will have to run this file first, then another called PutMsg.
; This routine reads the message and prints texts, that you have typed
; after PutMsg program as arguments.
; $VER: WaitPort.s V1.1 (30.10.94)
; Source by Cromax of Alchemy (kita@sun10.ci.pwr.wroc.pl)
;===================================================================[ Values ]=
ExecBase Equ 4
_LVOForbid Equ -132
_LVOPermit Equ -138
_LVOFindTask Equ -294
_LVOAddPort Equ -354
_LVORemPort Equ -360
_LVOGetMsg Equ -372
_LVOReplyMsg Equ -378
_LVOWaitPort Equ -384
_LVOCloseLibrary Equ -414
_LVOOpenLibrary Equ -552
_LVOWrite Equ -048
_LVOOutput Equ -060
NT_MSGPORT Equ 4
lh_TailPred Equ 008
mp_SigTask Equ 016
mp_MsgList Equ 020
mymsg_Length Equ 4 ; Offsets of our message
mymsg_String Equ 8 ; defined by myself
DOSVersion Equ 33 ; KickStart 1.2+
;=============================================================[ Main Program ]=
Section NewPort,Code_P
Begin: bra.s .Skip
dc.b "$VER: WaitPort V1.1 (30.10.94)",10,0
even
.Skip: movea.l [ExecBase].w,a6
lea DOSName,a1
moveq #DOSVersion,d0
jsr _LVOOpenLibrary(a6)
move.l d0,_DOSBase ; Can not open DOS library?
beq.w CloseDown ; Then quit!
movea.l [ExecBase].w,a6
jsr _LVOForbid(a6)
movea.l [ExecBase].w,a6 ; Find pointer to Task
suba.l a1,a1 ; structure of our task
jsr _LVOFindTask(a6) ; (if a1=NULL)
move.l d0,_Task
movea.l [ExecBase].w,a6
jsr _LVOPermit(a6)
lea MsgPort,a0 ; Complete MsgPort structure
move.l _Task,mp_SigTask(a0) ; If we didn't found anything
beq.w CloseDown ; then quit (rather impossible)
adda.l #mp_MsgList,a0 ; Set pointers of List struct
move.l a0,lh_TailPred(a0) ; in MsgPort structure
addq #4,a0 ; Get addres of lh_Tail
clr.l (a0) ; Clear lh_Tail
move.l a0,-(a0) ; Address of lh_Tail to lh_Head
movea.l [ExecBase].w,a6 ; Add these lines, if you want
lea MsgPort,a1 ; your port to be public (to
jsr _LVOAddPort(a6) ; add it to system's port list)
.Wait: movea.l [ExecBase].w,a6 ; Wait for message...
lea MsgPort,a0
jsr _LVOWaitPort(a6)
movea.l [ExecBase].w,a6
lea MsgPort,a0
jsr _LVOGetMsg(a6) ; In d0 we have pointer to
move.l d0,_Message ; Message structure
move.l d0,a0
adda.l #20,a0
move.l a0,_OurMessage ; In a0 pointer to our message
cmpi.l #"CRMX",(a0) ; Compare ID Header...
bne.s .Wait ; Naw, it's some crap...
movea.l _DOSBase,a6
jsr _LVOOutput(a6)
tst.l d0
beq.s ReplyMessage ; No output for text to write
movea.l _DOSBase,a6
move.l d0,d1
movea.l _OurMessage,a0
move.l mymsg_String(a0),d2
move.l mymsg_Length(a0),d3
cmpi.l #1,d3
beq.s ReplyMessage
jsr _LVOWrite(a6) ; Write string we've received
ReplyMessage: movea.l [ExecBase].w,a6
movea.l _Message,a1
jsr _LVOReplyMsg(a6)
CloseDown: nop ; Close everything down...
.RemPort: tst.l _Task
beq.s .End
movea.l [ExecBase].w,a6 ; Add these lines, if your
lea MsgPort,a1 ; port was public (to remove
jsr _LVORemPort(a6) ; it from port list)
.CloseDOS: tst.l _DOSBase
beq.s .End
movea.l [ExecBase].w,a6
movea.l _DOSBase,a1
jsr _LVOCloseLibrary(a6)
.End: moveq #0,d0
rts
;=====================================================================[ Data ]=
Section Data,Data_P
MsgPort: dc.l 0 ; ln_Succ
dc.l 0 ; ln_Pred
dc.b NT_MSGPORT ; ln_Type
dc.b 0 ; ln_Pri
dc.l PortName ; ln_Name
dc.b 0 ; mp_Flags
dc.b 0 ; mp_SigBits
dc.l 0 ; mp_SigTask
dc.l 0 ; lh_Head
dc.l 0 ; lh_Tail
dc.l 0 ; lh_TailPred
dc.b 0 ; lh_Type
dc.b 0 ; lh_pad
DOSName: dc.b "dos.library",0
PortName: dc.b "Amsterdam",0
;=====================================================================[ Vars ]=
Section Vars,Bss
_DOSBase: ds.l 1
_Task: ds.l 1
_Message: ds.l 1
_OurMessage: ds.l 1